package cn.com.bluemoon.daps.standard.service;

import cn.com.bluemoon.daps.common.domain.UserInfoHolder;
import cn.com.bluemoon.daps.common.enums.StandardAuditStatus;
import cn.com.bluemoon.daps.common.mp.IBmService;
import cn.com.bluemoon.daps.standard.entity.DapStandardAuditVersionMain;
import cn.com.bluemoon.daps.standard.vo.StandardDataModifyVo;
import cn.com.bluemoon.daps.standard.vo.StandardListSearchVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Optional;

/**
 * <p>
 * 数据标准的核心表，记录各标准的版本和审核状态 服务类
 * </p>
 *
 * @author admin
 * @since 2020-08-07
 */
@Validated
public interface DapStandardAuditVersionMainService extends IBmService<DapStandardAuditVersionMain> {

    void updateStandardPublishInfo(String standardId, Integer standardType, Boolean isPublish, String standardUniqueId);

    /**
     * 通过标准id和类型获取相应的流程实体
     *
     * @param standardId
     * @param standardType
     * @return
     */
    Optional<DapStandardAuditVersionMain> findOneByStandardIdAndStandardType(@NotNull(message = "标准id不可为空") String standardId,
                                                                             @NotNull(message = "标准类型不可为空") Integer standardType);

    /**
     * 根据标准id和标准类型，调整审批状态，会检验是否允许进行调整状态
     *
     * @param standardId
     * @param standardType
     * @param auditStatus
     * @param nextStandardId
     */
    void auditChangeByStandardId(String standardId, Integer standardType, StandardAuditStatus auditStatus, Integer modifyType, String nextStandardId);

    void deleteAllVersionStandard(String standardId, Integer standardType, boolean isLogic);

    void deleteStandard(String standardId, Integer standardType, boolean isLogic);

    /**
     * 根据流程id调整审批状态，会检验是否允许进行调整状态
     * @param auditId
     * @param auditStatus
     */
    void auditChangeStatusByAuditId(@NotNull(message = "流程id不可为空") String auditId, StandardAuditStatus auditStatus, Integer modifyType);

    /**
     * 基于审核标准整合标准数据返回分页
     *
     * @param standardListSearchVo
     * @param auditPageListRequest
     * @return
     */
    IPage<StandardDataModifyVo> modifyOrAuditListOfStandard(StandardListSearchVo<?> standardListSearchVo, Boolean auditPageListRequest);

    /**
     * 基于审核标准整合标准数据返回逻辑分页（树形结构）
     *
     * @param searchVo
     * @param auditListPageRequest
     * @return
     */
    IPage<StandardDataModifyVo>  modifyOrAuditLogicPageOfStandard(StandardListSearchVo<?> searchVo, Boolean auditListPageRequest);


    /**
     * 根据唯一id获取审批表中的有效数据都处于已发布状态，若是返回true
     *
     * @param standardUniqueId
     * @return
     */
    boolean checkStandardPublishedByStandardUniqueId(@NotBlank(message = "标准唯一id不可为空") String standardUniqueId);

    /**
     * 断言判断标准对应的审批数据必须都为已发布
     *
     * @param standardUniqueId 标准唯一id
     */
    void assetStandardPublished(@NotBlank(message = "标准唯一id不可为空") String standardUniqueId, String message);

    /**
     * 标准id获取标准唯一id然后进行判断都为已发布
     *
     * @param standardId
     * @param message
     */
    void assetStandardPublishedByStandardId(@NotBlank(message = "标准id不可为空")String standardId, String message);

    /**
     *
     * @param standardUniqueId 标准唯一ID
     * @return 获取有效流程信息
     */
    List<DapStandardAuditVersionMain> findByStandardUniqueId(String standardUniqueId);

    /** 记录标准版本*/
    void saveStandardVersion(List<String> auditIds, String modifyDesc, UserInfoHolder.UserInfo userInfo);
}
